import Vue from 'vue';
import Router from 'vue-router';

import store from './store.js';
import initHandler from './handler.js';

import RouterView from './RouterView.vue';

/**
 * 初始化（创建）路由实例
 */
function init (config, options) {
    Vue.use(Router);
    Vue.component('lv-router-view', RouterView);

    const router = new Router(config);

    /**
     * query 参数说明
     *
     * navKey：自动设置，页面栈标识
     * isBack：自动设置，用于判断该页面是否由上一页面 back 返回的
     * cache：往下一个页面跳转时，控制下一个页面是否需要缓存，默认不缓存
     * backRedirect：由上一个页面跳转时设置，当路由 back 时自动拦截并重定向
     */
    router.beforeEach((to, from, next) => {
        const fromPageData = store.getPageData(from.query.navKey);

        // 前进路由
        if (!store.state.isBack) {
            if (to.meta.isInitRefer) store.initPageStackLen();

            // path 传参
            if (store.state.pathData) {
                const pathData = store.state.pathData;
                const fixedValue = pathData?.fixedValue;
                if (fixedValue) {
                    pathData.nextFixedValue = fixedValue;
                    delete pathData.fixedValue;
                }

                store.changePathData(pathData, { needProcessData: false });
                store.savePathPageData(to.query.navKey);
                store.clearPathData();
            }

            // name 传参
            if (Object.keys(to.params).length > 0) {
                const fixedValue = to.params?.fixedValue;
                if (fixedValue) {
                    to.params.nextFixedValue = fixedValue;
                    delete to.params.fixedValue;
                }

                store.savePageData(to.query.navKey, to.params);
            }
        }

        // 回退路由
        if (store.state.isBack) {
            // 若是“首页”，无法再回退
            if (store.isReferPage()) {
                store.initPageStackLen();
                return;
            }

            to.query.isBack = true;

            // 恢复返回页面的 fixedValue
            store.changeBackData({ fixedValue: fromPageData?.nextFixedValue });
            store.saveBackPageData(to.query.navKey);

            // 清空状态
            store.clearBackData();
            store.changeBackFlag(false);

            /**
             * 清除页面数据
             *
             * 由于无论是 push 还是 replace 路由，都会生成新的页面数据，因此在回退路由时可以清除页面数据
             */
            store.removePageData(from.query.navKey);

            // 拦截并重定向
            if (from?.query?.backRedirect) {
                // todo
                return;
            }
        }

        // 离开页面时，清除 onceValue
        if (fromPageData?.onceValue) {
            delete fromPageData.onceValue;
            store.savePageData(from.query.navKey, fromPageData, { needProcessData: false });
        }

        // 日志
        if (options?.logger === true) {
            const { param, onceValue, fixedValue, nextFixedValue } = store.getPageData(to.query.navKey) || {};
            console.group();
            console.log('name', to.name);
            console.log('path', to.path);
            console.log('pageStackLen', store.state.pageStackLen);
            console.log('query', to.query);
            console.log('param', param);
            console.log('onceValue', onceValue);
            console.log('fixedValue', fixedValue);
            console.log('nextFixedValue', nextFixedValue);
            console.groupEnd();
        }

        next();
    });

    const handler = initHandler(router); // 挂载相关函数

    return { router, handler };
}

export default init;
